package xml;

import java.util.ArrayList;
import java.util.Date;

import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import bean.vo.ItemRemitoVO;
import bean.vo.ItemSolicitudCotizacionVO;
import bean.vo.RemitoClienteVO;
import bean.vo.RemitoODVVO;
import bean.vo.RemitoProveedorVO;
import bean.vo.RemitoVO;

public class SerializadorRemito {
	
	public static Node serializar(Node nodoPadre, RemitoClienteVO remito) throws Exception{
		Node nodoRemito = SerializadorRemito.getNodoRemito(nodoPadre, remito);
		SerializadorCliente.serializar(nodoRemito, remito.getCliente());
		SerializadorRemito.agregarNodosItems(nodoRemito, remito);
		
		return nodoRemito;
	}
	
	public static Node serialize(Node nodoPadre, RemitoODVVO remito) throws Exception{
		Node nodoRemito = SerializadorRemito.getNodoRemito(nodoPadre, remito);
		SerializadorODV.serializar(nodoRemito, remito.getOficinaDeVenta());
		SerializadorRemito.agregarNodosItems(nodoRemito, remito);
		
		return nodoRemito;
	}
	
	private static void agregarNodosItems(Node nodoRemito, RemitoVO remito) throws Exception{
		Node nodoReferencia = XmlUtil.addChild(nodoRemito, Constantes.REFERENCIA, null);
		
		ArrayList<Integer> numeroOrdenes = new ArrayList<Integer>();
		ArrayList<Date> fechasOrdenes = new ArrayList<Date>();
		
		for (ItemRemitoVO item : remito.getItemsRemito()) {
			if (!numeroOrdenes.contains(item.getOrdenReferencia().getNumeroPedido())) {
				numeroOrdenes.add(item.getOrdenReferencia().getNumeroPedido());
				fechasOrdenes.add(item.getOrdenReferencia().getFechaRecepcion());
			}
		}
		
		for (int i = 0; i < numeroOrdenes.size(); i++) {
			Integer numero = numeroOrdenes.get(i);
			Date fecha = fechasOrdenes.get(i);
			
			Node nodoOrdenPedido = XmlUtil.addChild(nodoReferencia,Constantes.ORDEN_PEDIDO, null);
			XmlUtil.addChild(nodoOrdenPedido,Constantes.NUMERO, numero);
			XmlUtil.addChild(nodoOrdenPedido,Constantes.FECHA, fecha);
			
			Node nodoRodamientos = XmlUtil.addChild(nodoOrdenPedido,Constantes.RODAMIENTOS, null);
			
			for (ItemRemitoVO item : remito.getItemsRemito()) {
				if (numero.equals(item.getOrdenReferencia().getNumeroPedido())) {
					SerializadorItemRemito.serializar(nodoRodamientos, item);
				}
			}
		}
	}
	
	private static Node getNodoRemito(Node nodoPadre, RemitoVO remito) throws Exception{
		Node nodoRemito = null;
		
		if (nodoPadre == null) {
			nodoRemito = XmlUtil.createRootNode(Constantes.REMITO);
		} else {
			nodoRemito = XmlUtil.addChild(nodoPadre, Constantes.REMITO, null);
		}
		XmlUtil.addComment(nodoRemito, Constantes.COMENTARIO_REMITO);
		XmlUtil.addAttribute(nodoRemito, Constantes.NUMERO, remito.getNumeroRemito());
		XmlUtil.addChild(nodoRemito,Constantes.EMISION, remito.getFechaEmision());
		
		return nodoRemito;		
	}
	
	public static RemitoProveedorVO deserializarRemitoProveedor(Node nodoRemitoProv) throws Exception{
		if(nodoRemitoProv.getNodeName() != Constantes.REMITO_PROVEEDOR){
			System.out.println(nodoRemitoProv.getNodeName());
			throw new Exception("Error - nodo remito de proveedor invalido");
		}
		
		RemitoProveedorVO remitoProv = new RemitoProveedorVO();
		remitoProv.setNumeroRemito(Integer.parseInt(XmlUtil.getAttributeValue(nodoRemitoProv, Constantes.NUMERO)));
		
		String fechaEmision = XmlUtil.getChildNodeValueWithName(nodoRemitoProv, Constantes.EMISION);
		remitoProv.setFechaEmision(XmlUtil.dateFormat.parse(fechaEmision));
		
		String fechaEntrega = XmlUtil.getChildNodeValueWithName(nodoRemitoProv, Constantes.ENTREGA);
		remitoProv.setFechaEntrega(XmlUtil.dateFormat.parse(fechaEntrega));
		
		Node nodoProveedor = XmlUtil.getChildNodeWithName(nodoRemitoProv, Constantes.PROVEEDOR);
		remitoProv.setProveedor(SerializadorProveedor.deserializar(nodoProveedor));
		
		NodeList items = XmlUtil.getChildNodeWithName(nodoRemitoProv, Constantes.RODAMIENTOS).getChildNodes();
		for (int i = 0; i < items.getLength(); i++) {
			Node nodoItem = items.item(i);
			if (nodoItem.getNodeName() == Constantes.ITEM) {
				ItemRemitoVO itemVo = SerializadorItemRemito.deserializar(nodoItem);
				remitoProv.agregarItem(itemVo);
			}
		}
		
		return remitoProv;
	}

}
